package com.copractice.data.dao;

import com.copractice.data.dao.answer.AnswerDAO;
import com.copractice.data.dao.feedback.FeedbackAnswerDAO;
import com.copractice.data.dao.feedback.UsersFeedbackDAO;
import com.copractice.data.dao.knowledge.UsersKnowledgeDAO;
import com.copractice.data.dao.performance.UsersPerformanceDAO;
import com.copractice.data.dao.performance.UsersQuestionsAttemptsDAO;
import com.copractice.data.dao.question.QuestionDAO;
import com.copractice.data.dao.tag.TagDAO;
import com.copractice.data.dao.user.UserDAO;

/**
 * Represents factory class which gives access to the DAO classes.
 *
 * @author Dmitry Churbanov (dmitry.churbanov@gmail.com)
 * @version 1.0 03/14/2009
 */
public interface DAOFactory {
    
    /**
     * Returns DAO for <code>User</code> class
     *
     * @return implementation of <code>UserDAO</code> interface
     * @see com.copractice.data.dao.user.UserDAO
     */
    public UserDAO getUserDAO();

    /**
     * Returns DAO for <code>Question</code> class
     *
     * @return implementation of <code>QuestionDAO</code> interface
     * @see com.copractice.data.dao.question.QuestionDAO
     */
    public QuestionDAO getQuestionDAO();
    
    /**
     * Returns DAO for <code>Answer</code> class
     *
     * @return implementation of <code>AnswerDAO</code> interface
     * @see com.copractice.data.dao.answer.AnswerDAO
     */
    public AnswerDAO getAnswerDAO();
    
    /**
     * Returns DAO for <code>Tag</code> class
     * 
     * @return implementation of <code>TagDAO</code> interface
     * @see com.copractice.data.dao.tag.TagDAO
     */
    public TagDAO getTagDAO();
    
    /**
     * Returns DAO for <code>UsersKnowledge</code> class
     * 
     * @return implementation of <code>UsersKnowledgeDAO</code> interface
     * @see com.copractice.data.dao.knowledge.UsersKnowledgeDAO
     */
    public UsersKnowledgeDAO getUserKnowledgeDAO();
    
    /**
     * Returns DAO for <code>UsersPerformance</code> class
     * 
     * @return implementation of <code>UsersPerformanceDAO</code> interface
     * @see com.copractice.data.dao.performance.UsersPerformanceDAO
     */
    public UsersPerformanceDAO getUserPerformanceDAO();
    
    /**
     * Returns DAO for <code>UsersFeedback</code> class
     * 
     * @return implementation of <code>UsersFeedbackDAO</code> interface
     * @see com.copractice.data.dao.feedback.UsersFeedbackDAO
     */
    public UsersFeedbackDAO getUsersFeedbackDAO();

    /**
     * Returns DAO for <code>FeedbackAnswerDAO</code> class
     * 
     * @return implementation of <code>FeedbackAnswerDAO</code> interface
     * @see com.copractice.data.dao.feedback.FeedbackAnswerDAO
     */
    public FeedbackAnswerDAO getFeedbackAnswerDAO();
    
    /**
     * Returns DAO for <code>UsersQuestionsAttemptsDAO</code> class
     * 
     * @return implementation of <code>UsersQuestionsAttemptsDAO</code> interface
     * @see com.copractice.data.dao.performance.UsersQuestionsAttemptsDAO
     */    
    public UsersQuestionsAttemptsDAO getUsersQuestionsAttemptsDAO();    

}
